import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.List;
import java.util.ArrayList;
/**
 * Classe que representa o personagem que o jogador controla.Já que sua movimentação
 * depende apenas da vontade do usuário,ela não implementa a interface movedor.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Ladrao extends Personagem
{
    private int quantidadeDiamante = 0;
    private int quantidadeOssos = 2;
    private int vida = 3;
    /**
     * Esse método simplesmente recebe o caracter informado pelo usuário e realiza o movimento correspondente. 
     */
    public void act() 
    {
        detectaColisao();
        
        if(encontrouDiamante()){
            pegarDiamante();
        }
        
        String teclaDigitada = Greenfoot.getKey();
    
        executaMovimento(teclaDigitada);
        
        atualizarX();
        atualizarY();
    }
    
    public void detectaColisao(){
        World tab = getWorld();
        List teste = tab.getObjectsAt(getX(),getY(),PersonagemNaoJogavel.class);
        
        if(!teste.isEmpty()){
            diminuirVida();
        }    
    }
    
    public int getVida(){
        return this.vida;
    }
    
    public int getDiamante(){
        return this.quantidadeDiamante;
    }
    
    public void diminuirVida(){
        this.vida--;
    }
    
    /**
     * Esse metodo recebe o caracter informado pelo usuário e de acordo com o caracter informado,realiza o
     * movimento do personagem. Esse codigo tambem verifica e trata quando o ladrao estiver numa posicao 
     * em alguma borda do tabuleiro.
     */
        private void executaMovimento(String t){
            Tabuleiro mundo = (Tabuleiro) getWorld();
           
            List teste = null;
            int x,y;
            final int BORDA_ESQ_X,BORDA_SUP_Y,BORDA_DIR_X,BORDA_INF_Y;
            
            BORDA_ESQ_X = BORDA_SUP_Y = 0;
            BORDA_INF_Y = BORDA_DIR_X = 7;
            
            if(t != null){
            char tecla = t.charAt(0);
            
            switch(tecla){
                case 'a':
                case'A':
                    setImage("Ladrao.png");
                    if(getX() == BORDA_ESQ_X){
                        mundo.mudarDeMundo(2);
                    }else{
                        teste = mundo.getObjectsAt(getX()-1, getY(), PersonagemNaoJogavel.class);
                        if(teste.isEmpty()){
                            move(-1);
                        }
                    }
               break;
                
               
                case 'd':
                case 'D':
                    setImage("Ladrao_mini2.png");
                    if(getX() == BORDA_DIR_X){
                        mundo.mudarDeMundo(3);
                    }else{
                        teste = mundo.getObjectsAt(getX()+1, getY(), PersonagemNaoJogavel.class);
                        if(teste.isEmpty()){
                            move(+1);
                        }
                    }
                 break;
                
                 
                case 'w':
                case 'W':
                    if(getY() == BORDA_SUP_Y){
                        teste = mundo.getObjectsAt(getX(), BORDA_INF_Y, PersonagemNaoJogavel.class);
                        if(teste.isEmpty()){
                            setLocation(getX(), BORDA_INF_Y);
                        }
                    }else{
                        teste = mundo.getObjectsAt(getX(), getY()-1, PersonagemNaoJogavel.class);
                        if(teste.isEmpty()){
                            setLocation(getX(), getY()-1);
                        }
                    }
                break;
               
                
               case 'x':
               case 'X':
                    if(getY() == BORDA_INF_Y){
                        teste = mundo.getObjectsAt(getX(), BORDA_SUP_Y, PersonagemNaoJogavel.class);
                        if(teste.isEmpty()){
                            setLocation(getX(), BORDA_SUP_Y);
                        }
                    }else{
                        teste = mundo.getObjectsAt(getX(), getY()+1, PersonagemNaoJogavel.class);
                        if(teste.isEmpty()){
                            setLocation(getX(), getY()+1);
                        }
                    }
               break;
               
               
               case 'q':
               case 'Q':
                    setImage("Ladrao.png");
                    if(getX() == BORDA_ESQ_X && getY() == BORDA_SUP_Y){
                        teste = mundo.getObjectsAt(BORDA_DIR_X, BORDA_INF_Y, PersonagemNaoJogavel.class);
                        if(teste.isEmpty()){
                            setLocation(BORDA_DIR_X, BORDA_INF_Y);
                        }
                    }else if(getX() != BORDA_ESQ_X && getY() != BORDA_SUP_Y){
                        teste = mundo.getObjectsAt(getX()-1, getY()-1, PersonagemNaoJogavel.class);
                        if(teste.isEmpty()){
                            setLocation(getX()-1, getY()-1);
                        }
                    }
                break;
                
                
                 case 'e':
                 case 'E':
                    setImage("Ladrao_mini2.png");
                    if(getX() == BORDA_DIR_X && getY() == BORDA_SUP_Y){
                        teste = mundo.getObjectsAt(BORDA_ESQ_X, BORDA_INF_Y, PersonagemNaoJogavel.class);
                        if(teste.isEmpty()){
                            setLocation(BORDA_ESQ_X, BORDA_INF_Y);
                        }
                    }else if(getX() != BORDA_DIR_X && getY() != BORDA_SUP_Y){
                        teste = mundo.getObjectsAt(getX()+1, getY()-1, PersonagemNaoJogavel.class);
                        if(teste.isEmpty()){
                            setLocation(getX()+1, getY()-1);
                        }
                    }
                 break;
                 
                 
                 case 'z':
                 case 'Z':
                    setImage("Ladrao.png");
                    if(getX() == BORDA_ESQ_X && getY() == BORDA_INF_Y){
                        teste = mundo.getObjectsAt(BORDA_DIR_X, BORDA_SUP_Y, PersonagemNaoJogavel.class);
                        if(teste.isEmpty()){
                            setLocation(BORDA_DIR_X, BORDA_SUP_Y);
                        }
                    }else if(getX() != BORDA_ESQ_X && getY() != BORDA_INF_Y){
                        teste = mundo.getObjectsAt(getX()-1, getY()+1, PersonagemNaoJogavel.class);
                        if(teste.isEmpty()){
                            setLocation(getX()-1, getY()+1);
                        }
                    }
                 break;
                 
                 
                  case 'c':
                  case 'C':
                    setImage("Ladrao_mini2.png");
                    if(getX() == BORDA_DIR_X && getY() == BORDA_INF_Y){
                        teste = mundo.getObjectsAt(BORDA_ESQ_X, BORDA_SUP_Y, PersonagemNaoJogavel.class);
                        if(teste.isEmpty()){
                            setLocation(BORDA_ESQ_X, BORDA_SUP_Y);
                        }
                    }else if(getX() != BORDA_DIR_X && getY() != BORDA_INF_Y){
                        teste = mundo.getObjectsAt(getX()+1, getY()+1, PersonagemNaoJogavel.class);
                        if(teste.isEmpty()){
                            setLocation(getX()+1, getY()+1);
                        }
                    }
                 break;
                 
                 
                 case 's':
                 case 'S':
                          if(encontrouBueiro()){
                             Bueiro bueiro = (Bueiro)getOneObjectAtOffset(0, 0, Bueiro.class);
                            setLocation(bueiro.retornaCoordenadaXDestino(),bueiro.retornaCoordenadaYDestino());
                            
                            }
                break;
                
                 case 'f':
                 case 'F':
                        if(temOssos()){
                            x=getX();
                            y=getY();
                            Osso novoOsso = new Osso();
                            mundo.addObject(novoOsso, x, y);
                           quantidadeOssos--;
                        }
                          
                break;
                
            }
        }
    }
    
    /**
     * Checa se a quantidade de ossos do ladrão é maior que zero.Caso isso seja verdade, o retorno será true, se não será false.
     */
    public boolean temOssos(){
        if(quantidadeOssos > 0){
            return true;
        }
        return false;
    }
    
    
    /**
     * Checa se na posição do ladrão existe um diamante.
     */
    public boolean encontrouDiamante(){
      Actor diamante = getOneObjectAtOffset(0, 0, Diamante.class);
         if(diamante != null) {
                return true;
         }else{
               return false;
        }
    }
    
    /**
     * O ladrão coleta o diamante na mesma casa em que o mesmo se encontra.
     */
    public void pegarDiamante(){
         Actor diamante = getOneObjectAtOffset(0, 0, Diamante.class);
            if(diamante != null) {
              getWorld().removeObject(diamante);
              quantidadeDiamante++;
            }
    
    }

    
    /**
     * Checa se na posição do ladrão existe um bueiro.
     */
    public boolean encontrouBueiro(){
         Actor bueiro = getOneObjectAtOffset(0, 0, Bueiro.class);
            if(bueiro != null) {
                return true;
            }
            else {
                return false;
        
        }
        
    }
    
}
